package com.cw.DesignModel23.Structural.FlyweightPattern.Flyweight1;

import java.util.HashMap;

/**
 *
 3. 定义 享元工厂类 :
 ① 对象池 : 享元工厂类 中维护一个静态的 HashMap<String, AbstractFlyweight> 数据结构 , 这就是对象池在内存中的数据结构 ,
 键 String 数据就是 享元类的 外部状态 , 用于作为 享元对象 的 身份标识 , 每个享元对象的该 外部状态值 都不一样 ;
 ② 从对象池中获取对象 : 从 HashMap<String, AbstractFlyweight> OBJECT_POOL 对象池中获取 AbstractFlyweight 抽象享元类 对象时 ,
 先检查对象池中是否有该数据 , 如果使用 map.get() 获取的 享元对象不为空 , 说明对象池中有该数据 , 直接返回即可 ;
 如果 map.get() 获取的 享元对象为空 , 说明对象池中没有该对象 , 需要创建该对象 , 放入对象池 , 然后返回 ;
 注意要使用 外部状态传入构造函数创建对象 ;
 ————————————————
 版权声明：本文为CSDN博主「韩曙亮」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 原文链接：https://blog.csdn.net/shulianghan/article/details/105452239
 *
 * 享元工厂
 * 维护对象池
 */
public class FlyweightFactory {
    /**
     * 对象池
     * 使用对象时, 从对象池中查找
     * 如果找到直接取出
     * 如果没有找到, 创建一个新对象, 放入对象池中, 然后返回该对象
     * 键 : 外部状态 值 : 享元对象
     */
    private static final HashMap<String, AbstractFlyweight> OBJECT_POOL = new HashMap<String, AbstractFlyweight>();
    public static AbstractFlyweight getObject(String externalState){
        //从对象池中获取对象
        ConcreteFlyweight object = (ConcreteFlyweight) OBJECT_POOL.get(externalState);
        //如果对象池中没有该对象
        if(object == null){
            object = new ConcreteFlyweight(externalState);
            OBJECT_POOL.put(externalState, object);
            System.out.println("创建新对象 外部状态 值 : " + externalState + " , 并放入对象池");
        }else{
            System.out.println("获取对象池中已有的对象 , 外部状态 值 : " + externalState);
        }
        return object;
    }
}

